'''
tokens[]
i=0;
stack=[开]
while(stack != [])
    if (stack[top] 是某终结符):
        if 下一个token是这个终结符:
            top=top-1;
        else:
            还原
    elif stack[top]不是终结符：
        top=top-1
        stack[top]=非终结符
        top=top+1
'''
class 栈类:
    def __init__(self,s):
        self.列=s
        self.长 = len(self.列)
    def 增(self,n):
        for c in n:
            self.列.append(c)
        self.长 = len(self.列)
    def 减(self):
        self.列.pop()
        self.长 = len(self.列)
    def 显(self):
        print(self.列)
    def 长(self):
        return self.长
        
        
stack=["开"]
tokens="组花量等数行花行"
tokens="组花量等数行量等数行花行"
tokens="组花量等数行量等数行量等数行量等数行量等数行量等数行量等数行量等数行量等数行量等数行花行"
nums=[1,2,3,4,5,6,7,8,9,10]
tokensr = list(tokens[::-1])
NEXT={}
NEXT["开"]="组排"
NEXT["排"]="花班花行"
NEXT["班"]={0:"式",1:"式班"}
NEXT["式"]="量等数行"
MC=""

global 量地址,数序号
量地址=64
数序号=len(nums)-1

class 递归语法分析器:
    def __init__(self,量地址,数序号):
        self.量地址=64
        self.数序号=数序号
        self.MC=""
    def 开分析(self,T):
        if T[-1]=="组":
            T.pop()
            return self.排分析(T)
        else:
            print("开分析时遇到非法字符")
        return False
    def 排分析(self,T):
        果=False
        if T[-1]=="花":
            T.pop()
            if T[-1]=="量":
                果=self.班分析(T)
                if T[-1]=="花":
                    T.pop()
                    if T[-1]=="行":
                        T.pop()
                        果=True
        return 果

    def 班分析(self,T):
        if T[-1]=="量":
            if T[-5]=="花":
                return self.式分析(T)
            elif T[-5]=="量":
                if self.式分析(T):
                    return self.班分析(T)
        return False    
    def 式分析(self,T):
        if T[-1]=="量":
            T.pop()
            if T[-1]=="等":
                T.pop()
                if T[-1]=="数":
                    T.pop()
                    if T[-1]=="行":
                        T.pop()
                        self.MC=self.MC+"放%s入A;A入内存第%s;"%(nums[self.数序号],self.量地址)
                        self.量地址=self.量地址+1
                        self.数序号=self.数序号-1
                        return True
        return False

if __name__=="__main__":
    print("语法分析:递归")
    分析器=递归语法分析器(64,len(nums)-1)
    print(tokens)
    if 分析器.开分析(T=tokensr):
        print(分析器.MC)
    else:
        print("遇到错误")

